package org.java.cart.web;

import org.java.common.entity.Cart;
import org.java.cart.service.CartService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * @author WHQ
 * @version 1.0
 * @date 2022-3-13 0013 下午 3:18
 */
@RestController
public class CartController {
    @Autowired
    private CartService cartService;
    /**
     * 测试地址:http://api.shopping.com/cart/add/cart
     * @param cart
     * @return
     * 如果js中传递的json格式的数据，后台微服务要用对象接收，方法中声明形参时必须要加一个注解
     * @RequestBody,这样才可以把json数据转换成对象，否则数据无法填充到对象中
     * Cart对象中一个包含下列属性:
     * skuId,title,images,price,userId,num
     * 其中skuId,num,均有值
     * title ,images,price可以通过skuId商品服务获得这些信息
     * userId表示当前是哪一个用户的购物信息，它可以从令牌中解析，获得UserInfo信息，然后
     * 取得载荷中的Id，即为当前用户id
     * 要获得用户的Id，必须通过Jwt的公钥进行解析才可以得到
     * 如果购物车服务中有多个方法，那么每一个方法都要进行解析令牌得到用户信息，
     * 如果在每一个方法中解析token，那么就会有大量重复代码.
     * 我们希望出现的效果是，在整个服务中令牌只需要解析一次，所有方法都可以直接获得载荷信息，不用重复解析.
     * 此时要实现此效果，解析令牌的操作就不能在控制器中编写，
     */
    @PutMapping("/add/cart")
    public ResponseEntity<Void> addCart(@RequestBody Cart cart){
        System.out.println(cart.getNum());
        cartService.addCart(cart);
        return ResponseEntity.ok().build();
    }

    /**
     * 显示购物车页面的方法
     * 访问地址:http://api.shopping.com/cart/query/cart
     * @return
     */
    @GetMapping("/query/cart")
    public ResponseEntity<List<Cart>> queryCart(){
        List<Cart> list=cartService.queryCart();
        return  ResponseEntity.ok(list);
    }

    /**
     * 访问地址:http://api.shopping.com/cart/cut/{skuId}
     * @param skuId
     * @return
     */
    @PutMapping("/cut/{skuId}")
    public ResponseEntity<Void> cutNum(@PathVariable("skuId")Long skuId){
        System.out.println("进入修改数量的方法");
        cartService.cutNum(skuId);
        return ResponseEntity.ok().build();
    }

    /**
     * 访问地址:http://api.shopping.com/cart/add/{skuId}
     * @param skuId
     * @return
     */
    @PutMapping("/add/{skuId}")
    public ResponseEntity<Void> addNum(@PathVariable("skuId")Long skuId){
        System.out.println("进入修改数量的方法");
        cartService.addNum(skuId);
        return ResponseEntity.ok().build();
    }
    @DeleteMapping("/del/{skuId}")
    public ResponseEntity<Boolean> del(@PathVariable("skuId")Long skuId){
        System.out.println("进入删除的方法");
        Boolean flag = cartService.del(skuId);
        if (flag){
            //删除成功
            return ResponseEntity.ok().build();
        }else {
            return ResponseEntity.badRequest().build();
        }
    }

    /**
     * 访问地址:http://api.shopping.com/cart/batchDel
     * @param
     * @return
     */
    @DeleteMapping("/batchDel")
    public ResponseEntity<Void> batchDel(@RequestParam String[] skuIdList){
        System.out.println("进入方法");
        cartService.batchDel(skuIdList);
        return ResponseEntity.ok().build();
    }
}
